package site.beanyon.now.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import site.beanyon.now.mapper.TimeCardMapper;
import site.beanyon.now.model.dto.TimeCardDTO;
import site.beanyon.now.model.dto.TimeSpanDTO;
import site.beanyon.now.model.po.TimeCardPO;

import java.util.ArrayList;
import java.util.List;

/**
 * 时间卡片相关服务类
 */
@Service
public class TimeCardServiceImpl implements TimeCardService {
    @Autowired
    private TimeCardMapper timeCardMapper;

    @Autowired
    private TimeSpanService timeSpanService;

    @Autowired
    private UserService userService;

    /**
     * 根据用户id和时间戳查询时间卡片列表及其对应的时间区间列表
     *
     * @param date 要查询的日期（yyyy-MM-dd 格式）
     * @return 持有时间区间对象的时间卡片列表
     */
    @Override
    public List<TimeCardDTO> listTimeCard(String date) {
        Integer userId = this.userService.getCurrentUser().getId();
        // 从数据库中读取时间卡片数据
        List<TimeCardPO> timeCardPOList = this.timeCardMapper.listTimeCard(userId, date);
        return convertPOs2DTOs(timeCardPOList);
    }

    /**
     * 为用户创建时间卡片
     *
     * @param timeCardPO 用于接收存入数据库后的时间卡片id
     * @return 是否创建成功
     */
    @Override
    public boolean createTimeCard(TimeCardPO timeCardPO) {
        Integer userId = this.userService.getCurrentUser().getId();
        timeCardPO.setUserId(userId);
        return this.timeCardMapper.insertTimeCard(timeCardPO).equals(1);
    }

    /**
     * 为用户创建时间卡片，并绑定时间卡片的activity字段
     *
     * @param userId   用户id
     * @param activity 活动名称
     * @return 是否创建成功
     */
    @Override
    public boolean createTimeCardWithActivity(Integer userId, String activity) {
        return this.timeCardMapper.insertTimeCardWithActivity(userId, activity).equals(1);
    }

    /**
     * 删除时间卡片
     *
     * @param userId 时间卡片所属的用户id
     * @param cardId 要删除的时间卡片id
     * @return 是否删除成功
     */
    @Override
    public boolean deleteTimeCard(Integer cardId) {
        Integer userId = this.userService.getCurrentUser().getId();
        return this.timeCardMapper.deleteTimeCard(userId, cardId).equals(1);
    }

    /**
     * 更新时间卡片的activity
     *
     * @param cardId   时间卡片id
     * @param activity 新的activity
     * @return 是否修改成功
     */
    @Override
    public boolean updateActivity(Integer cardId, String activity) {
        Integer userId = this.userService.getCurrentUser().getId();
        return this.timeCardMapper.updateActivity(userId, cardId, activity).equals(1);
    }

    /**
     * 判断今日时间卡片中是否已经存在activity
     *
     * @param activity 活动名称
     * @return 是否存在
     */
    @Override
    public boolean activityExists(String activity) {
        Integer userId = this.userService.getCurrentUser().getId();
        return !this.timeCardMapper.queryCountByActivity(userId, activity).equals(0);
    }

    /**
     * 使用TimeCardPO列表构建TimeCardDTO列表，并返回
     *
     * @param timeCardPOList 时间卡片的持久化对象列表
     * @return 时间卡片的传输对象列表
     */
    public List<TimeCardDTO> convertPOs2DTOs(List<TimeCardPO> timeCardPOList) {
        List<TimeCardDTO> timeCardDTOList = new ArrayList<>(timeCardPOList.size());

        // 遍历TimeCardPO，构建TimeCardBO
        for (TimeCardPO timeCardPO : timeCardPOList) {
            List<TimeSpanDTO> timeSpanDTOList = this.timeSpanService.listTimeSpan(timeCardPO.getId());
            timeCardDTOList.add(new TimeCardDTO(timeCardPO, timeSpanDTOList));
        }

        return timeCardDTOList;
    }
}
